package org.langqiao.algorithm;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
public class heidong {
	static List<List<Integer>> alllist=new ArrayList<List<Integer>>();
	public static void main(String[] args)
	{
		for(int a=0;a<=9;a++)
		{
			for(int b=0;b<a;b++)
			{
				for(int c=0;c<b;c++)
				{
					for(int d=0;d<c;d++)
					{
						for(int e=0;e<d;e++)
						{
							int temp=a*10000+b*1000+c*100+d*10+e;
							List<Integer> list=findRing(temp);//自定了 的findRing()方法，
							if(list!=null)
							{
								alllist.add(list);
							}
						}
					}
				}
			}
		}
		//控制输出格式
		for(List<Integer> list:alllist)
		{
			System.out.print("[");
			for(int i=0;i<list.size();i++)
			{
				int temp=list.get(i).intValue();
				System.out.print(temp);
				if(i!=list.size()-1)
				{
					System.out.print(",");
				}
				System.out.print("]");
				System.out.println();
			}
		}
	}
	//获得最大的数
	static int getMax(int num)
	{
		String temp=String.valueOf(num);
		char[] tempCharArray=temp.toCharArray();//将字符窜temp转换成字符数组
		Arrays.sort(tempCharArray);//排序
		StringBuffer sb=new StringBuffer(new String(tempCharArray));//实例化一个StringBuffer对象
		sb.reverse();//利用StringBuffer对象的reverse()方法，实现翻转
		for(int i=0;i<5-tempCharArray.length;i++)//如果不足5位，则在前面补0
		{
			sb.append('0');
		}
		return Integer.parseInt(sb.toString());
	}
	//获得最小的数
	static int getMin(int num)
	{
		String temp=String.valueOf(num);
		char[] tempCharArray=temp.toCharArray();
		Arrays.sort(tempCharArray);
		//return Integer.parseInt(tempCharArray);//tempCharArray是个字符数组，不能直接转换成整型的，可以先将字符数组转换成字符选类型
		return Integer.parseInt(new String(tempCharArray));
	}
	//得到最大值-最小值，构成下一个数
	static int getNext(int num)
	{
		return getMax(num)-getMin(num);
	}
	//查找某个数是否在在某个链表里面
	static int find(List<Integer> list,int num)
	{
		int index=-1;
		for(int i=0;i<list.size();i++)
		{
			if(list.get(i).intValue()==num)
			{
				index=i;
				break;
			}
		}
		return index;
	}
	//判断某个数是否已经存在环中
	static boolean exists(int num)
	{
		int index=-1;
		for(List<Integer> list:alllist)
		{
			if(find(list,num)>-1)
			{
				return true;
			}
		}
		return false;
	}
	static List<Integer> findRing(int num)//自定义findRing()方法
	{
		List<Integer> list=new ArrayList<Integer>();
		int temp=num;
		while(true)//一定存在环中
		{
			temp=getNext(temp);
			if(temp==0||exists(temp))
				return null;
			int index=find(list,num);
			if(index!=-1)
			{
				return list.subList(index,list.size());
			}
			else
			{
				list.add(temp);
			}
			
		}
	}
}
